#pragma once

// Copyright (c) 2010 Manuel Peinado Gallego <manuel.peinado@gmail.com>
// Distributed under the MIT license

// LogManager.h : interface of the LogManager class
//

#include <string>
#include <list>
#include <set>

class LogManager;

class LogListener 
{
public:
    virtual void onMessage(LogManager*, const std::string&)
    { 
    }
};


class LogManager : boost::noncopyable
{
public:
    LogManager();

    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 

    // Adds a message to the log and preprends current date and time
    void addLogMessage(const std::string & msg);

    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 

    void addLogListener(LogListener * listener);
    void removeLogListener(LogListener * listener);
    
    // ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** 

private:

    // We use set<> to avoid duplicates
    std::set<LogListener *> m_listeners;
    void notifyListeners();

    // ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** 

    std::list<std::string> m_logMessages;
};